<?php

    class CTemplate
    {
		var $m_szFileName;	//file name
		var $m_szFile;		//file content
		var $m_iFileSize;	//file size
		var $m_szFilePath;	//
		
		var $m_hVar;		//all html variables
		
		var $m_szPhpCode;	//script php code
		
		 static function &GetInstance()
		 {
			global $g_hObjects;
			static $m_hApp = NULL;
						 
			if(!isset($m_hApp))
			{
				$m_hApp = new CTemplate();					 
				$g_hObjects[] = $m_hApp;
				$m_hApp->OnInit();
			}
			
			return $m_hApp;
		}
		
		function OnInit()
		{
			$this->m_hVar = array();
		}
		
		function OnDestroy()
		{
		}
		
		/* perform tpl file loading */
		function Load($szFileName)
		{
			$this->m_szFile = CFile::FileToString($szFileName);
			$this->m_szFileSize = strlen($this->m_szFile);
			
			$this->m_szFilePath = $szFileName;
			
			$this->ParseInclude();
		}
		
		//dodaje zmienna do szablonu
		function AddVar($szName,$szVal)
		{
			$this->m_hVar[$szName] = $szVal;
		}
		
		
		//usuwa zmienna z szablonu
		function RemVar($szName)
		{
			unset($this->m_hVar[$szName]);
		}
		
		//parsuje dyrektywe include
	    function ParseInclude()
		{
			$cOpenTag  = '{';
			$cCloseTag = '}';
			
			$iOffset   = 0; 	
			$iTagOpen  = 0; 	
			$iTagClose = 0; 	
					
			$bTagOpen   = false;
			$bOmmitTags = false;
			
			$szRootDir =  substr($this->m_szFilePath,0,strrpos($this->m_szFilePath,'/'));
			
			$szFile = '';
				
			while(true)
			{
				if($iOffset >= $this->m_szFileSize)
				{
					break;
				}
				
				$iTagOpen  = strpos($this->m_szFile,$cOpenTag,$iOffset);
				$iTagClose = strpos($this->m_szFile,$cCloseTag,$iOffset);
				
				if($iTagOpen === false || $iTagClose === false)
				{
					break;
				}
				
				$szTag = substr($this->m_szFile,$iTagOpen+1,$iTagClose-$iTagOpen-1);
				$szTag = trim($szTag);
				
				$szFile .= substr($this->m_szFile,$iOffset,$iTagOpen-$iOffset);
				
				if(strncmp($szTag,'include',7) == 0)
				{
					$szInc = substr($szTag,7);
					$szInc = $szRootDir.'/'.trim($szInc);
					
					//jesli plik istnieje - zaladuj jego content
					$szFileContent = is_file($szInc) ? file_get_contents($szInc) : '';
					
					//
					$szFile .= substr($this->m_szFile,$iOffset,$iTagOpen-$iOffset);
				
				
					if($szFileContent) { $szFile .= $szFileContent; }
				}
				
				$iOffset = $iTagClose + 1;
			}
			
			$szFile .= substr($this->m_szFile,$iOffset);
			$this->m_szFile = $szFile;
		}
		
		/* perform tpl file parsing */
		function Parse()
		{
			//adding few session data
			$hSession = CSession::GetInstance();
		
			$this->AddVar('klient_id',$hSession->GetVar('klient_id'));
			$this->AddVar('login',$hSession->GetVar('login'));
			//end of adding	
		
			//adding get array to template
			$this->AddVar('get',$_GET);
			
			//adding get array to template
			$this->AddVar('post',$_POST);
			
			//adding cookies array to template
			$this->AddVar('cookie',$_COOKIE);
			
			//adding session array
			$this->AddVar('session',$hSession->GetVarArray());
			
			
			$cOpenTag    = '{';		//znak otwarcia tagu
			$cCloseTag   = '}';		//znak zamkniecia tagu
			
			$iOffset     = 0; 		//pozycja w pliku ktory jest przetwarzany
			$iTagOpen    = 0; 		//znak otwierajacy tag
			$iTagClose   = 0; 		//znak zamykajacy tag
					
			$bTagOpen    = false; 	//czy tag jest otwarty
			
			$m_szPhpCode = ''; 		//kod php do wykonania
			$szTag 		 = ''; 		//nazwa obecnie przetwarzane tag
			
			$bStyle		 = false;	//stan tagu style  - czy jest otwarty
			$bScript	 = false;	//stan tagu script - czy jest otwarty
			
			extract($this->m_hVar);	//importujemy zmienne do tablicy symboli dla exec
			
			while(true)
			{
				//gdy zakonczymy parsowanie dokumentu, wykonajmy kod
				if($iOffset >= $this->m_szFileSize)
				{
					//echo '<![CDATA['.$m_szPhpCode.']]></code>';
					eval($m_szPhpCode);
					break;
				}
			
				$iTagOpen  = strpos($this->m_szFile,$cOpenTag,$iOffset);
				$iTagClose = strpos($this->m_szFile,$cCloseTag,$iOffset);
				
				//if no tags were found, we print the html content till
				//the end of file
				if($iTagOpen === false || $iTagClose === false)
				{
					//replacing html " with php compatible \"
					$szHtmlCode = substr($this->m_szFile,$iOffset);
					$szHtmlCode = str_replace('"','\"',$szHtmlCode);
					$szHtmlCode = trim($szHtmlCode);
					
					$m_szPhpCode .= 'print "'.$szHtmlCode.'"; ';
					
					$iOffset = $this->m_szFileSize;
					
					continue;
				}
				
				//zawartosc w klamrach tagu
				$szTag = substr($this->m_szFile,$iTagOpen+1,$iTagClose-$iTagOpen-1);
				
				//kasujemy biale znaki
				$szTag = trim($szTag);
				
				
				if(!$bTagOpen)
				{
					//replacing html " with php compatible \"
					$szHtmlCode = substr($this->m_szFile,$iOffset,$iTagOpen-$iOffset);
					$szHtmlCode = str_replace('"','\"',$szHtmlCode);
					$m_szPhpCode .= 'print  "'.$szHtmlCode.'"; ';
				}
				else
				{
					$m_szPhpCode .= substr($this->m_szFile,$iOffset,$iTagOpen-$iOffset);
				}
				
				//obsluga tagu style
				if(strncmp($szTag,'style',5) == 0) {   $bStyle = true; }
				
				if(strncmp($szTag,'/style',6) == 0) {  $bStyle = false; }
				
				if($bStyle && !$bTagOpen && $szTag != 'style')
				{	
					$szTag = str_replace('"','\"',$szTag);
					
					$m_szPhpCode .= 'print "{'.$szTag.'}";';
				}
				
				if($bStyle) { $iOffset = $iTagClose + 1; continue; }
				//koniec obslugi
				
				
				//obsluga tagu script
				if(strncmp($szTag,"script",5) == 0) {  $bScript = true;  }
				
				if(strncmp($szTag,"/script",6) == 0) { $bScript = false; }
				
				if($bScript && !$bTagOpen && $szTag != 'script' )
				{	
					$szTag = str_replace('"','\"',$szTag);
					
					$m_szPhpCode .= 'print "{'.$szTag.'}";';
					
					$szTag = '';
				}
				
				if($bScript) { $iOffset = $iTagClose + 1;  continue; }
				//koniec obslugi
				
				
				
				//otwarcie sekcji php
				if(strncmp($szTag,"php",2) == 0) { $bTagOpen = true; }
				
				//zamkniecie sekcji php
				if(strncmp($szTag,"/php",3) == 0) { $bTagOpen = false; }
				
				
				//loop
				if(strncmp($szTag,"loop",3) == 0)
				{
					$szTag = str_replace('loop','for',$szTag);
				
					$m_szPhpCode .= $szTag." { ";
				}
				
				if(strncmp($szTag,"/loop",4) == 0)
				{
					$m_szPhpCode .= " } ";
				}
				
				//if section
				if(strncmp($szTag,"if",1) == 0)
				{
					$m_szPhpCode .= $szTag." { ";
				}
				
				if(strncmp($szTag,"elseif",5) == 0)
				{
					$szTag = str_replace('elseif','else if',$szTag);
				
					$m_szPhpCode .= "} ".$szTag." { ";
				}
				else if(strncmp($szTag,"else",3) == 0 )
				{
					$m_szPhpCode .= '}';
					$m_szPhpCode .= 'else';
					$m_szPhpCode .= '{';
				}
				
				if(strncmp($szTag,"/if",2) == 0)
				{
					$m_szPhpCode .= '}';
				}
				
				//foreach section
				if(strncmp($szTag,"foreach",6) == 0)
				{
					$m_szPhpCode .= $szTag." { ";
				}
				
				if(strncmp($szTag,"/foreach",7) == 0)
				{
					$m_szPhpCode .= " } ";
				}
				
				if(strncmp($szTag,"$",1) == 0 && strpos($szTag,'=') > 0)
				{
					list($szVar,$iVal) = explode('=',$szTag);
					
					$szVar = trim($szVar);
					$iVal  = trim($iVal);
					
					$m_szPhpCode .= $szVar.'='.$iVal.';';
				}
				else if(strncmp($szTag,'$',1) == 0 && 
				        (strpos($szTag,'++') > 0 || 
				         strpos($szTag,'--') > 0 ||
				         strpos($szTag,'+=') > 0 ||
				         strpos($szTag,'-=') > 0 ||
				         strpos($szTag,'*=') > 0 ||
				         strpos($szTag,'%=') > 0 ))
				{
					$m_szPhpCode .= $szTag.';'; 
				}
				else if(strncmp($szTag,'$',1) == 0 && strpos($szTag,'|') === false)
				{
					$szVarName = trim($szTag);
					
					if(!$szVarName || !isset($szVarName)) { continue; }
	
					
					$m_szPhpCode .= 'if( !isset('.$szVarName.') )';
					$m_szPhpCode .= '{ ';
					$m_szPhpCode .= $szVarName.'="";';
					$m_szPhpCode .= '}';
					$m_szPhpCode .= 'else {';
					$m_szPhpCode .= 'str_replace('."'"."\""."'".","."'".'\"'."'".",$szVarName); ";
					$m_szPhpCode .= 'print  '.$szVarName.' ; ';
					$m_szPhpCode .= '}';
					
					
					$szVarName = '';
				}
				else if(strncmp($szTag,'$',1) == 0 && strpos($szTag,'|') > 0)
				{
					$aParams = explode('|',$szTag);
	
					if(!is_array($aParams) || !isset($aParams[0]) ) { continue; }
					
					$szVarName = trim($aParams[0]);
					
					$m_szPhpCode .= 'if( !isset('.$szVarName.') )';
					$m_szPhpCode .= '{ ';
					$m_szPhpCode .= $szVarName.'="";';
					$m_szPhpCode .= '}';
					
					
					foreach($aParams as &$szTmp)
					{
						$szTmp = trim($szTmp);
						
						//kasuje tagi html'owe
						if(strncmp($szTmp,"nohtml",5) == 0)
						{
							$m_szPhpCode .= "echo strip_tags($szVarName);";
						}
						
						//zamienia entera na br
						if(strncmp($szTmp,"nl2br",4) == 0)
						{
							$m_szPhpCode .= "echo nl2br($szVarName); ";
						}
						
						//castuje zmienna na int
						if(strncmp($szTmp,"int",2) == 0)
						{
							$m_szPhpCode .= "echo (int)$szVarName;";
						}
						
						//castuje zmienna na float
						if(strncmp($szTmp,"float",4) == 0)
						{
							$m_szPhpCode .= "$echo (float)$szVarName;";
						}
						
						//urlencoduje
						if(strncmp($szTmp,"url",2) == 0)
						{
							$m_szPhpCode .= "echo urlencode($szVarName);";
						}
						
						//castuje zmienna do typu money
						if(strncmp($szTmp,"money",4) == 0)
						{
							var_dump($szVarName);
							
							$m_szPhpCode .= "echo number_format($szVarName,2,',',' ');";
						}
						
						//obcina text do zadanej dlugosci
						if(strncmp($szTmp,"less",3) == 0)
						{
							$iPos   = strpos($szTmp	,":") + 1;
							$iCount = substr($szTmp,$iPos);
							
							$m_szPhpCode .= "echo substr($szVarName,0,(int)$iCount);";
						}
						
						//zmienna bedzie zawierac tylko podstawowe znaki ascii
						if(strncmp($szTmp,"ascii",3) == 0)
						{						
							$m_szPhpCode .= '$g_szTmp = ""; ';
							
							$m_szPhpCode .= '$g_aRepA = array("ą","ę","ś","ć","ń","ź","ż"); ';
							$m_szPhpCode .= '$g_aRepB = array("a","e","s","c","n","z","z"); ';
							
							$m_szPhpCode .= '$g_szTmp = '.$szVarName.';';
							$m_szPhpCode .= '$g_szTmp = urldecode($g_szTmp);';
							$m_szPhpCode .= '$g_szTmp = mb_strtolower($g_szTmp);';
							$m_szPhpCode .= '$g_szTmp = str_replace($g_aRepA,$g_aRepB,$g_szTmp);';
							
							$m_szPhpCode .= 'for($i=0;$i<strlen($g_szTmp);$i++)';
							$m_szPhpCode .= '{ ';
							$m_szPhpCode .= '$g_szTmp[$i] = ctype_alnum($g_szTmp[$i]) ? $g_szTmp[$i] : "-"; ';
							$m_szPhpCode .= '} ';
							
							$m_szPhpCode .= 'print trim($g_szTmp,"-");';
						}
						
						if(strncmp($szTmp,'ord',2) == 0)
						{
							$m_szPhpCode .= '$g_szTmp = '.$szVarName.';';
							$m_szPhpCode .= '$g_szOut = ""; ';
							
							$m_szPhpCode .= 'for($i=0;$i<strlen($g_szTmp);$i++)';
							$m_szPhpCode .= '{ ';
							$m_szPhpCode .= '$g_szOut .= "&#".ord($g_szTmp[$i]); ';
							$m_szPhpCode .= '} ';
							
							$m_szPhpCode .= 'print $g_szOut;';
						}
						
					}
					
					$szVarName = '';
				}
				
				if(strncmp($szTag,"#isotime",4) == 0) 
				{
					$m_szPhpCode .= 'echo date("Y-m-d H:i:s",time());';
				}
		
				if(strncmp($szTag,"#pltime",4) == 0) 
				{    
					$m_szPhpCode .= 'echo date("H:i:s d-m-Y",time());';
				}
				
				if(strncmp($szTag,"checkval",7) == 0 )
				{
					$szVar = trim(substr($szTag,8));
					 
					$m_szPhpCode .= 'if( !isset('.$szVar.') )';
					$m_szPhpCode .= '{ ';
					$m_szPhpCode .= $szVar.'="";';
					$m_szPhpCode .= '}';
					$m_szPhpCode .= 'else { echo '.$szVar.'; }';
					
				}
				
				if(strncmp($szTag,"checked",6) == 0) 
				{
					$szVar = trim(substr($szTag,7));
				
					$m_szPhpCode .= 'if( isset('.$szVar.') && '.$szVar.' == 1) { echo "checked"; }';
				}
				
				if(strncmp($szTag,"changeurl",8) == 0) 
				{
					$szVar = trim(substr($szTag,9));
					
					list($szWhat,$szTo) = explode(' ',$szVar);
								
					if( strpos($szTo,'$') === false )
					{
						$m_szPhpCode .= 'if(strpos($_SERVER["REQUEST_URI"],"'.$szWhat.'"))';
						$m_szPhpCode .= '{';
						$m_szPhpCode .= 'echo eregi_replace("'.$szWhat.'=[_a-z0-9-]+","'.$szWhat.'='.$szTo.'",$_SERVER["REQUEST_URI"]);';
						$m_szPhpCode .= '}';
						$m_szPhpCode .= 'else';
						$m_szPhpCode .= '{';
						$m_szPhpCode  .= 'echo  $_SERVER["REQUEST_URI"].( strpos($_SERVER["REQUEST_URI"],"?")  ? "&" : "?")."'.$szWhat.'='.$szTo.'";';
						$m_szPhpCode .= '}';
					}
					else
					{
						$m_szPhpCode .= 'if(strpos($_SERVER["REQUEST_URI"],"'.$szWhat.'"))';
						$m_szPhpCode .= '{';
						$m_szPhpCode .= 'echo eregi_replace("'.$szWhat.'=[_a-z0-9-]+","'.$szWhat.'=".'.$szTo.',$_SERVER["REQUEST_URI"]);';
						$m_szPhpCode .= '}';
						$m_szPhpCode .= 'else';
						$m_szPhpCode .= '{';
						$m_szPhpCode  .= 'echo  $_SERVER["REQUEST_URI"].( strpos($_SERVER["REQUEST_URI"],"?")  ? "&" : "?")."'.$szWhat.'=".'.$szTo.';';
						$m_szPhpCode .= '}';
					}
				}
			
				$szTag = '';
				
				$iOffset = $iTagClose + 1;

			
			}//koniec petli while
			
		}//koniec metody parse
				
    }    
?>